이터레이터 패턴은 컬렉션 구현 방법을 노출시키지 않으면서 집합체 안에 들어있는 모든 항목에 접근할 수 있도록 하는 패턴이다. java의 stream이 대표적인 이터레이터 패턴의 예시이다.
@RequiredArgsConstructor
public class ArrIterator implements Iterator<Integer> {
private final Integer[] list;
private int position = 0;
@Override
public boolean hasNext() {
return position < list.length;
}
@Override
public Integer next() {
return list[position++];
}
}
@RequiredArgsConstructor
public class ListIterator implements Iterator<Integer> {
private final List<Integer> list;
private int position = 0;
@Override
public boolean hasNext() {
return position < list.size();
}
@Override
public Integer next() {
return list.get(position++);
}
}
java.util의 Iterator를 상속받았고 각각 일반 배열, List를 가지고 있는 두개의 클래스를 만들었다.
public class App {
public static void main(String[] args) {
Integer[] arr = {1, 2, 3};
ArrIterator iterator1 = new ArrIterator(arr);
System.out.println("ArrIterator");
while(iterator1.hasNext()){
System.out.println(iterator1.next());
}
List<Integer> list = Arrays.asList(1, 2, 3);
ListIterator iterator2 = new ListIterator(list);
System.out.println("ListIterator");
while(iterator2.hasNext()){
System.out.println(iterator2.next());
}
}
}
ArrIterator와 ListIterator는 다른 타입의 Integer 목록을 가지고 있지만 인터페이스를 상속받아 구현한 hasNext()와 next()를 통해 동일한 방식으로 요소를 탐색할 수 있다.
이 링크로 가면 코드를 볼 수 있다.